#include <cv.h>
#include <cvaux.h>
#include <highgui.h>

#include <cstring>
#include <cmath>
#include <fstream>
#include <sstream>
#include <opencv2/ml/ml.hpp>

#include <stdio.h>
#include <math.h>

#include <stdio.h>
#include <stdlib.h>
#include <libICA.h>

using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
   Mat src,dif,ddif;
   src=imread(argv[1]);
   dif=imread(argv[2]);
   ddif=imread(argv[3]);
   Mat dst(src.rows,src.cols,CV_8UC3);
   
   
   int i,j,t;
   
   double smax=atof(argv[4]);
   double smin=atof(argv[5]);
   double dmax=atof(argv[6]);
   double dmin=atof(argv[7]);
   double ddmax=atof(argv[8]);
   double ddmin=atof(argv[9]);
   
   for(i=0;i<src.rows;i++)
    {
      for(j=0;j<src.cols;j++)
      {
         for(t=0;t<3;t++)
	  {
	    double l=src.at<Vec3b>(i,j)[t];
	    double r=dif.at<Vec3b>(i,j)[t];
	    double m=ddif.at<Vec3b>(i,j)[t];
	    l=l/255*(smax-smin)+smin;
	    r=r/255*(dmax-dmin)+dmin;
	    m=m/255*(ddmax-ddmin)+ddmin;
	    if(l+r+m>255)
		dst.at<Vec3b>(i,j)[t]=255;
	    else
	    {
		if(l+r+m<0)
		    dst.at<Vec3b>(i,j)[t]=0;
		else
		    dst.at<Vec3b>(i,j)[t]=l+r+m;
	    }
	    
	  }
      }
    }
    imwrite("FINAL.jpg",dst);

}
